package com.boarsoft.mongodb.core;

import org.bson.Document;
import org.bson.conversions.Bson;

import com.mongodb.client.ListDatabasesIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoIterable;

/**
 * 通过MongoDB driver操作MongoDB接口
 * 
 * @author Mac_J
 *
 */
public interface MongoDao {
	/**
	 * 获取DB实例 - 指定DB
	 * 
	 * @param dbName
	 * @return
	 */
	MongoDatabase getDatabase(String dbName);

	/**
	 * 获取collection对象 - 指定Collection
	 * 
	 * @param dbName
	 * @param collName
	 * @return
	 */
	MongoCollection<Document> getCollection(String dbName, String collName);

	/**
	 * 查询DB下的所有集合的名称
	 * 
	 * @param dbName
	 * @return
	 */
	MongoIterable<String> getAllCollections(String dbName);

	/**
	 * 获取所有数据库名称列表
	 * 
	 * @return
	 */
	MongoIterable<String> listDatabaseNames();

	/**
	 * 
	 * @return
	 */
	ListDatabasesIterable<Document> listDatabases();

	/**
	 * 删除一个数据库
	 * 
	 * @param dbName
	 */
	void dropDatabase(String dbName);

	/**
	 * 查找对象 - 根据主键_id
	 * 
	 * @param collection
	 * @param id
	 * @return
	 */
	Document find(MongoCollection<Document> coll, String id);

	/**
	 * 统计文档数
	 * 
	 * @param coll
	 * @return
	 */
	Long count(MongoCollection<Document> coll, Bson filter);

	/**
	 * 条件查询，不分页
	 * 
	 * @param coll
	 * @param filter
	 * @return
	 */
	MongoCursor<Document> list(MongoCollection<Document> coll, Bson filter);

	/**
	 * 通过ID删除指定的文档
	 * 
	 * @param coll
	 * @param id
	 * @return
	 */
	int delete(MongoCollection<Document> coll, String id);

	/**
	 * 更新指定ID的文档
	 * 
	 * @param coll
	 * @param id
	 * @param newdoc
	 * @return
	 */
	Document update(MongoCollection<Document> coll, String id, Document newdoc);

	/**
	 * 删除集合
	 * 
	 * @param dbName
	 * @param collName
	 */
	void dropCollection(String dbName, String collName);

	/**
	 * 关闭连接
	 */
	void close();

	/**
	 * 替换某个文档
	 * 
	 * @param coll
	 * @param id
	 * @param newdoc
	 * @return
	 */
	Document replace(MongoCollection<Document> coll, String id, Document newdoc);

	/**
	 * 
	 * @param coll
	 * @return
	 */
	Long count(MongoCollection<Document> coll);

	/**
	 * 向指定集合插入文档
	 * 
	 * @param dbName
	 * @param collName
	 * @param doc
	 */
	void insert(String dbName, String collName, Document doc);

	/**
	 * 分页查询
	 * 
	 * @param coll
	 * @param filter
	 * @param orderBy
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	MongoCursor<Document> list(MongoCollection<Document> coll, Bson filter, String orderBy, int pageNo, int pageSize);
}
